/*
 * FuncionDaoJdbc.java      1.0   25/02/2011
 *
 * Copyright Grupo 3A UPC
 * All rights reserved.
 *
 * Contiene el manejo JDBD para las busquedas de la pelicula 
 */

package pe.edu.upc.dew.grupo3a.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

import pe.edu.upc.dew.grupo3a.model.Funcion;

public class FuncionDaoJdbc extends SimpleJdbcDaoSupport implements FuncionDao{
	PeliculaDao peliculaDao; 
	SalaDao salaDao;

	public void setPeliculaDao(PeliculaDao peliculaDao) {
		this.peliculaDao = peliculaDao;
	}

	public void setSalaDao(SalaDao salaDao) {
		this.salaDao = salaDao;
	}
	
	@Override
	public Funcion getFuncionPorCodigo(String codigofuncion) {
		try {
			return getSimpleJdbcTemplate()
			.queryForObject(
					"select f.codigofuncion,f.codigosala,f.codigopelicula,f.horario,f.precio," +
					"f.subtitulada,f.butacasvendidas " +
					"from funcion f where codigofuncion=?" ,
					new RowMapper<Funcion>(){
						public Funcion mapRow(ResultSet rs, int rowNum) throws SQLException {
							Funcion funcion = new Funcion();
							funcion.setPelicula(peliculaDao.getPeliculaPorCodigo(rs.getString("codigopelicula")));
							funcion.setSala(salaDao.getSalaPorCodigo(rs.getString("codigosala")));
							funcion.setButacasVendidas(rs.getInt("butacasvendidas"));
							funcion.setCodigofuncion(rs.getString("codigofuncion"));
							funcion.setHorario(rs.getString("horario"));
							funcion.setPrecio(rs.getDouble("precio"));
							funcion.setSubtitulada(rs.getBoolean("subtitulada"));
							return funcion;
						}
					},
					codigofuncion);
			
		} catch(DataAccessException ex ){
			return null;
		}
	}

	@Override
	public List<Funcion> getFuncionPorSala(String sala) {
		try {
			return getSimpleJdbcTemplate()
			.query(
					"select s.tipo,f.codigofuncion,f.codigosala,f.codigopelicula,f.horario,f.precio," +
					"f.subtitulada,f.butacasvendidas " +
					"from sala s inner join funcion f on s.codigosala=f.codigosala " +
					"where s.tipo=? ",
					new BeanPropertyRowMapper<Funcion>(){
						public Funcion mapRow(ResultSet rs, int rowNum) throws SQLException {
							Funcion funcion = new Funcion();
							funcion.setPelicula(peliculaDao.getPeliculaPorCodigo(rs.getString("codigopelicula")));
							funcion.setSala(salaDao.getSalaPorCodigo(rs.getString("codigosala")));
							funcion.setButacasVendidas(rs.getInt("butacasvendidas"));
							funcion.setCodigofuncion(rs.getString("codigofuncion"));
							funcion.setHorario(rs.getString("horario"));
							funcion.setPrecio(rs.getDouble("precio"));
							funcion.setSubtitulada(rs.getBoolean("subtitulada"));
							return funcion;
						}
					},
					sala);
			
		} catch(DataAccessException ex ){
			//System.out.println(ex.getMessage());
			return null;
		}
	}

	@Override
	public void actualizarFuncion(Funcion funcion) {
	
		getSimpleJdbcTemplate().update("Update funcion set codigosala=?,codigopelicula=?," +
				"horario=?,precio=?,subtitulada=?,butacasvendidas=? " +
				"where codigofuncion=?",
				funcion.getSala().getCodigosala(),
				funcion.getPelicula().getCodigopelicula(),
				funcion.getHorario(),
				funcion.getPrecio(),
				funcion.getSubtitulada(),
				funcion.getButacasVendidas(),
				funcion.getCodigofuncion());
	}

	@Override
	public void insertarFuncion(Funcion funcion) {
		int count= getSimpleJdbcTemplate().queryForInt("Select count(*) from funcion");
		String newcodigo = "000000" + String.valueOf(count+1);
		funcion.setCodigofuncion(newcodigo.substring(newcodigo.length()-6));
		getSimpleJdbcTemplate().update("Insert into funcion (codigofuncion,codigosala,codigopelicula," +
				"horario,precio,subtitulada,butacasvendidas) values(?,?,?,?,?,?,?)",
				funcion.getCodigofuncion(),
				funcion.getSala().getCodigosala(),
				funcion.getPelicula().getCodigopelicula(),
				funcion.getHorario(),
				funcion.getPrecio(),
				funcion.getSubtitulada(),
				funcion.getButacasVendidas());
	}


	@Override
	public void eliminarFuncionPorCodigo(String codigofuncion) {
		getSimpleJdbcTemplate().update("delete from funcion where codigofuncion=?", codigofuncion);
	}

	@Override
	public List<Funcion> getFuncionPorPelicula(String pelicula) {
		try {
			return getSimpleJdbcTemplate()
			.query(
					"select f.codigofuncion,f.codigosala,f.codigopelicula,f.horario,f.precio," +
					"f.subtitulada,f.butacasvendidas " +
					"from funcion f, pelicula p  "+
					"where p.nombre=? and f.codigopelicula=p.codigopelicula",
					new BeanPropertyRowMapper<Funcion>(){
						public Funcion mapRow(ResultSet rs, int rowNum) throws SQLException {
								Funcion funcion = new Funcion();
								funcion.setPelicula(peliculaDao.getPeliculaPorCodigo(rs.getString("codigopelicula")));
								funcion.setSala(salaDao.getSalaPorCodigo(rs.getString("codigosala")));
								funcion.setButacasVendidas(rs.getInt("butacasvendidas"));
								funcion.setCodigofuncion(rs.getString("codigofuncion"));
								funcion.setHorario(rs.getString("horario"));
								funcion.setPrecio(rs.getDouble("precio"));
								funcion.setSubtitulada(rs.getBoolean("subtitulada"));
								return funcion;
								
						}
					},
					pelicula);
			
		} catch(DataAccessException ex ){
			//System.out.println(ex.getMessage());
			return null;
		}
	}

	@Override
	public List<Funcion> getFunciones() {
		try {
			return getSimpleJdbcTemplate()
			.query(
					"select f.codigofuncion,f.codigosala,f.codigopelicula,f.horario,f.precio," +
					"f.subtitulada,f.butacasvendidas " +
					"from funcion f  ",
					new BeanPropertyRowMapper<Funcion>(){
						public Funcion mapRow(ResultSet rs, int rowNum) throws SQLException {
								Funcion funcion = new Funcion();
								funcion.setPelicula(peliculaDao.getPeliculaPorCodigo(rs.getString("codigopelicula")));
								funcion.setSala(salaDao.getSalaPorCodigo(rs.getString("codigosala")));
								funcion.setButacasVendidas(rs.getInt("butacasvendidas"));
								funcion.setCodigofuncion(rs.getString("codigofuncion"));
								funcion.setHorario(rs.getString("horario"));
								funcion.setPrecio(rs.getDouble("precio"));
								funcion.setSubtitulada(rs.getBoolean("subtitulada"));
								return funcion;
								
						}
					});
			
		} catch(DataAccessException ex ){
			//System.out.println(ex.getMessage());
			return null;
		}
	}

}
